package main

import "fmt"

func main() {
	/*
			深拷贝：拷贝的是数值本身
				值类型的数据，默认都是深拷贝：array, int, float, string, bool, struct

			浅拷贝：拷贝的是数据的地址
				导致多个变量指向同一块内存
				引用类型的数据，默认都是浅拷贝：slice, map
				eg：s2 = s1

				因为切片是引用类型的数据，直接拷贝的是地址

			func copy(dst, src []type) int
		 		可以实现切片的拷贝
	*/
	s1 := []int{1, 2, 3, 4}
	s2 := make([]int, 0) //len:0,cap:0
	for i := 0; i < len(s1); i++ {
		s2 = append(s2, s1[i]) // 将 s1 的数据 copy 到 s2 中
	}
	fmt.Println(s1) // [1 2 3 4]
	fmt.Println(s2) // [1 2 3 4]

	s1[0] = 100
	fmt.Println(s1) // [100 2 3 4]
	fmt.Println(s2) // [1 2 3 4]

	//copy() //深拷贝
	s3 := []int{7, 8, 9}
	fmt.Println(s2) // [1 2 3 4]
	fmt.Println(s3) // [7 8 9]

	copy(s2, s3)    // 将 s3 中的元素，拷贝到 s2 中
	fmt.Println(s2) // [7 8 9 4]
	fmt.Println(s3) // [7 8 9]

	copy(s3, s1)    // 将 s1 中的元素拷贝到 s3 中
	fmt.Println(s1) // [100 2 3 4]
	fmt.Println(s3) // [100 2 3]

	copy(s3[1:], s2[2:]) // 将 s2 中的元素从下标为 2 的元素开始拷贝到 s3 中（s3 从 1 开始粘贴 s2 中的元素）
	fmt.Println(s2)      // [7 8 9 4]
	fmt.Println(s3)      // [100 9 4]

}
